<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // 2. 函数封装  
    // 优点: 可根据既定的参数 快速创建对象 

    // 缺点:
    // 1. 通过该函数创建的对象,和函数没有关系(对比:实例化对象和构造函数的关系)
    // var arr = new Array(1, 2, 3);
    // console.log(arr instanceof Array);

    // var obj = {};
    // console.log(obj instanceof Object);

    // 2. 公有的属性和方法重复创建 => 占内存 

    // function cat(name, color) {
    //     var obj = {
    //         name: name,
    //         color: color,
    //         species: "猫科",
    //         call: function () {
    //             console.log("喵喵!");
    //         },
    //         skill() {
    //             console.log("捉老鼠!");
    //         }
    //     }
    //     return obj;
    // }

    // var Tom = cat("Tom", "colorful の black");
    // console.log(Tom);

    // var Kitty = cat("Kitty", "pink");
    // console.log(Kitty);


    // 面向对象的封装(自定义构造函数)
    // 1. Tom Kitty等实例化对象 都是由构造函数Cat创建的 


    function Cat(name, color) {
        // {}
        // this -> {}

        this.name = name;
        this.color = color;

        // 公有的属性和方法 => 重复声明 => 占内存
        this.species = "猫科";
        this.call = function () {
            console.log("喵喵");
        }
        this.skill = function () {
            console.log("捉老鼠");
        }

        // return this;
    }

    var Tom = new Cat("Tom", "colorful の black");
    console.log(Tom, Tom instanceof Cat);

    var Kitty = new Cat("Kitty", "pink");
    console.log(Kitty, Kitty instanceof Cat);







</script>

</html>